クランバトル/周回スコア計算の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- 移動:バックアップ
- 最新のバージョン:2025-02-11 20:18:02
- バージョン:(Rev:5ezYRz0GwP)2025-02-11 14:18:57
Old | New | 差分 | |
---|---|---|---|
1 | 1 | * 周回スコア表の計算プログラム [#lhgno88] | |
2 | 2 | クランバトル第41回(2021/07)以降に対応しています。 | |
3 | 3 | 第79回(2024/09)の調整まで実装。 | |
4 | + | プログラミング言語Pythonの仕様により、コピペした後にインデントを調整する必要があります。 | |
4 | 5 | ||
5 | 6 | #!/usr/bin/env python3 | |
6 | 7 | ||
43 | 44 | boss_hp.append( [ 9,12,15,18,23] ) | |
44 | 45 | boss_hp.append( [12,15,20,23,30] ) | |
45 | 46 | boss_hp.append( [35,40,45,50,58] ) | |
46 | - | elif version >= 20230 | |
47 | + | elif version >= 202304: | |
47 | 48 | boss_hp.append( [ 6, 8,10,12,15] ) | |
48 | 49 | boss_hp.append( [ 8,10,13,15,20] ) | |
49 | 50 | boss_hp.append( [20,22,25,28,30] ) | |
54 | 55 | # 4段階目(全5段階の場合のみ) | |
55 | 56 | if False: | |
56 | 57 | pass | |
57 | - | elif version >= 20230 | |
58 | + | elif version >= 202304: | |
58 | 59 | pass | |
59 | 60 | elif version >= 202204: | |
60 | 61 | boss_hp.append( [22,23,27,29,31] ) | |
71 | 72 | boss_hp.append( [540,560,600,620,640] ) | |
72 | 73 | elif version >= 202309: | |
73 | 74 | boss_hp.append( [270,280,300,310,320] ) | |
74 | - | elif version >= 20230 | |
75 | + | elif version >= 202304: | |
75 | 76 | boss_hp.append( [200,210,230,240,250] ) | |
76 | 77 | elif version >= 202209: | |
77 | 78 | boss_hp.append( [145,150,175,195,210] ) | |
89 | 90 | boss_mult.append( [ Fraction(x,10) for x in [16,16,18,19,20] ] ) | |
90 | 91 | if False: | |
91 | 92 | pass | |
92 | - | elif version >= 20230 | |
93 | + | elif version >= 202304: | |
93 | 94 | boss_mult.append( [ Fraction(x,10) for x in [20,20,21,21,22] ] ) | |
94 | 95 | boss_mult.append( [ Fraction(x,10) for x in [45,45,47,48,50] ] ) | |
95 | 96 | else: | |
104 | 105 | pass | |
105 | 106 | elif version >= 202309: | |
106 | 107 | loop_sep = [ 0, 6,22] | |
107 | - | elif version >= 20230 | |
108 | + | elif version >= 202304: | |
108 | 109 | loop_sep = [ 3, 9,25] | |
109 | 110 | elif version >= 202112: | |
110 | 111 | loop_sep = [ 3,10,30,38] | |
129 | 130 | ||
130 | 131 | stage_scores = [] # 各段階の、全ボスを1体ずつ倒した場合の合計スコア | |
131 | 132 | stage_scores_diff = [] # 各段階の途中周回での、完了に必要な最大値と最小値の差 | |
132 | - | for i in range(len( | |
133 | - | score = | |
133 | + | for i in range(len(boss_hp)): | |
134 | + | scores = [] | |
134 | 135 | for hp, mult in zip(boss_hp[i], boss_mult[i]): | |
135 | - | score += round(hp_unit * hp * mult) | |
136 | - | score_diff = score - round(hp_unit * boss_hp[i][0] * boss_mult[i][0]) | |
136 | + | scores.append( round(hp_unit * hp * mult) ) | |
137 | + | score = sum(scores) | |
138 | + | score_diff = score - min(scores) | |
137 | 139 | stage_scores.append(score) | |
138 | 140 | stage_scores_diff.append(score_diff) | |
139 | 141 | ||
140 | 142 | loop_scores = [] # 各周回の、周回完了に必要なスコアの最小値と最大値の対 | |
143 | + | stage_loop_begin = [0] + loop_sep[:] | |
144 | + | stage_loop_end = loop_sep[:] + [loop_max+1] | |
141 | 145 | score = 0 | |
142 | 146 | for i in range(len(loop_sep)+1): | |
143 | - | loop_begin = 0 | |
144 | - | if i > 0: | |
145 | - | loop_begin = loop_sep[i-1] | |
146 | - | loop_end = loop_max+1 | |
147 | - | if i < len(loop_sep): | |
148 | - | loop_end = loop_sep[i] | |
147 | + | loop_begin = stage_loop_begin[i] | |
148 | + | loop_end = stage_loop_end[i] | |
149 | + | if loop_begin >= loop_end: | |
150 | + | continue | |
149 | 151 | for j in range(loop_end - loop_begin - 1): | |
150 | 152 | score += stage_scores[i] | |
151 | 153 | score_min = score | |
152 | 154 | score_max = score + stage_scores_diff[i] | |
153 | 155 | loop_scores.append( (score_min, score_max) ) | |
154 | - | if i < len(loop_sep) | |
156 | + | if i < len(loop_sep): | |
155 | 157 | score += stage_scores[i] | |
156 | 158 | loop_scores.append( (score, score) ) | |
157 | 159 | ||
159 | 161 | # ここから計算結果の出力 | |
160 | 162 | # | |
161 | 163 | ||
162 | - | for i in range(len(loop_scores)): | |
163 | - | iloop = i+1 | |
164 | - | score_min, score_max = loop_scores[i] | |
164 | + | for iloop,v in enumerate(loop_scores,1): | |
165 | + | score_min, score_max = v | |
165 | 166 | if score_min == score_max: | |
166 | 167 | print( '|{:d}|>|CENTER:{:,d}|'.format(iloop, score_min) ) | |
167 | 168 | else: |